package com.wengcheng.scala.demo

import scala.collection.mutable.ArrayBuffer

/**
  * 需求：给定一个整数的数组缓冲，要移除除了第一个负数之外的所有负数
  * Created by adengdeng on 2017/7/27 
  */
object ArrayDemo {

  /**
    *
    * @param a
    */
  def deleteNeg(a: ArrayBuffer[Int]) = {
    val indexes = for (i <- 0 until a.length if a(i) < 0) yield i
    //indexes = (3, 5, 6)
    //不能val b = indexex.reverse.trimEnd(1) reverse后，它是一个Seq序列。
    //value trimEnd is not a member of scala.collection.immutable.IndexedSeq[Int]
    val b = new ArrayBuffer[Int]()
    b ++= indexes.reverse //b = (6, 5, 3)
    b.trimEnd(1) //删除最后一个数组元素  b = (6, 5)
    //remove是ArrayBuffer的函数,如果传入的是Array，则需要调用toBuffer
    for (i <- b) a.remove(i) //依次移除 a 中的 -4 ， -1 元素，这样元素8只需要移动两次
  }

  def deleteNeg2(b: ArrayBuffer[Int]) {
    var first = true
    //首先收集需要保留的下标 indexes = (0, 1, 2, 3, 4, 7)
    val indexes = for (i <- 0 until b.length if first || b(i) >= 0) yield {
      if (b(i) < 0) first = false; i
    }

    //然后将元素移动倒该去的位置，并截断尾端                                                           -1  这里-1 被替换成了8
    for (j <- 0 until indexes.length) b(j) = b(indexes(j)) //对前6个下标元素赋值 b = (1, 2, 4, -2, 0, 8, -4, 8)
    b.trimEnd(b.length - indexes.length) // 删除b中最后2个元素 ，也就是 -4 和 8，trimEnd（2）调用remove(6, 2)也就是从下标6开始删除
  }

  def main(args: Array[String]): Unit = {

    val a = ArrayBuffer(1, 2, 4, -2, 0, -1, -4, 8)

//    val startTime = System.currentTimeMillis()
//    deleteNeg(a)
//    println(System.currentTimeMillis() - startTime)
//    a.foreach(print)

    //以下方式性能更优：
    val startTime2 = System.currentTimeMillis()
    deleteNeg2(a)
    println(System.currentTimeMillis() - startTime2)
    a.foreach(print)
  }
}
